#include <iostream>
#include <string>
#include <cstdarg>

using namespace std;

#define SIZE 1024

enum class LogLevel
{
    INFO,
    DEBUG,
    WARNING,
    ERROR,
    FATAL
};

string LevelToString(LogLevel level) //需要传入枚举类型，我们使用的是枚举类进行进行判断
{
    switch(level)
    {
        case LogLevel::INFO :
        return "INFO";
        case LogLevel::DEBUG :
        return "DEBUG";
        case LogLevel::WARNING :
        return "WARNING";
        case LogLevel::ERROR :
        return "ERROR";
        case LogLevel::FATAL :
        return "FATAL";
    }
}

void PrintLog(LogLevel Log_Level, const char *format, ...)
{
    //左半部分 日志等级 + 日志时间
    time_t t = time(nullptr);
    struct tm* pt = localtime(&t);
    char leftbuffer[SIZE];
    snprintf(leftbuffer, sizeof(leftbuffer) - 1, "[%s][%d-%d-%d %d:%d:%d]: ",
     LevelToString(Log_Level).c_str(),
     pt->tm_year, pt->tm_mon, pt->tm_mday,
     pt->tm_hour, pt->tm_min, pt->tm_sec);


    //右半部分 自定义部分
    va_list s;
    va_start(s, format);
    char rightbuffer[SIZE];
    vsnprintf(rightbuffer, sizeof(rightbuffer) - 1, "%s", s);

    //进行打印
    fprintf(stdout, "%s%s", leftbuffer, rightbuffer);
}

int main()
{
    PrintLog(LogLevel::INFO, "%s", "HelloWorld\n");

    return 0;
}



// int sum(int n, ...)
// {
//     va_list s; //定义一个s变量
//     va_start(s, n); //初始化

//     int total = 0;
//     for(int i = 0; i < n; ++i)
//     {
//         total += va_arg(s, int);      
//     }
    
//     va_end(s);

//     return total;    
// }

// int main()
// {
//     printf("total: %d\n", sum(3, 1, 2, 3));

//     return 0;
// }